Retry known idempotent SELECT queries, New Active Record configuration option, and more! | This Week in Rails
ActiveRecordに関する変更です
ActiveRecordのconfigに permanent_connection_checkout が追加されました
この設定では ActiveRecord::Base.connection が使われたときの挙動として次のいずれかを指定できます
エラーを発生させる
非推奨の警告を発する
どちらも発しない
ActiveRecord::Base.connection はDBコネクションプールからコネクションをチェックアウトし、リクエストまたはジョブが終了するまでコネクションを維持されたままにします
この挙動は、使用可能なDBコネクション数よりも多くのThreadまたはFiberを使用する環境では望ましくない場合があります
そんな場合は ActiveRecord::Base.connection の代わりに ActiveRecord::Base.with_connection を使用することでコネクションを節約することができます
with_connection メソッドは、受け取ったブロックの中だけコネクションを維持し、ブロックを抜けたらコネクションを解放します
with_connection メソッドについては第7回で紹介しているのでそちらも聴いてみてください
今回のプルリクエストでは permanent_connection_checkout の設定値を指定することで、connection メソッドの使用を禁止、あるいは、警告により発見できるようになり、DBコネクションを節約したいアプリケーションの開発において便利になりますね
ActiveRecordに関する変更です
モデルのhas_one associationやhas_many associationにはさまざまなオプションを指定することができます
指定できないオプションを指定した場合には、エラーが発生し、エラーメッセージには指定可能なオプションの一覧が記載されます
このプルリクエストでは、そのエラーメッセージの修正をしています
具体的には、エラーメッセージに記載される指定可能なオプションの一覧に as と through が含まれていなかったので、追加しています
また、throughオプションを指定した場合には source, source_type, disable_joins も指定できるので、指定可能なオプションの一覧に追加するようにしています
これらのオプションは ActiveRecord::Associations::Builder モジュールの HasOne クラス、および HasMany クラスのクラスメソッド valid_options に実装されています
ActiveRecordに関する変更です
DBコネクション関連のエラーが発生した場合にSELECTクエリを自動的に再実行する仕組みを実装しています
ただし、再実行されるのは
メソッドに対して明示的に再実行可能であることを示すパラメータを指定した場合
冪等であることが分かっているメソッドが呼ばれる場合
です
例えばfind_by_sqlメソッドには allow_retry というキーワード引数が指定できるようになっています
code:method signature
find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block)
allow_retryにtrueを渡すとDBコネクション関連のエラーが発生した場合にSELECTクエリを自動的に再実行します
また、findメソッドやfind_byメソッドなど、冪等なSELECTクエリが発行されることが自明であるメソッドについては、ActiveRecordの内部的に再実行可能のフラグが立つように実装に手が加えられています